package com.hbnu.controller;

import com.hbnu.pojo.DormBuild;
import com.hbnu.pojo.User;
import com.hbnu.service.DormManagerService;
import com.hbnu.service.UserService;
import com.hbnu.service.impl.DormManagerServiceImpl;
import com.hbnu.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 宿舍管理员管理
 * 请求地址：http://localhost:8080/dormManager.action?action=list
 * 请求方式：GET
 * 请求参数：action:list
 *
 * @author chendikai
 * @date 2024-11-13 下午 2:53
 */
@WebServlet("/dormManager.action")
public class DormManagerServlet extends HttpServlet {

    private UserService userService = new UserServiceImpl();

    DormManagerService dormManagerService = new DormManagerServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");

        String action = req.getParameter("action");

        String id = req.getParameter("id");

        List<DormBuild> builds = dormManagerService.find();
        req.setAttribute("builds", builds);

        if ("list".equals(action)) {

            String searchType = req.getParameter("searchType");
            String keyword = req.getParameter("keyword");

            // 查询出所有的宿舍管理员信息
            List<User> userList = userService.findAllManager(searchType, keyword);

            req.setAttribute("searchType", searchType);
            req.setAttribute("keyword", keyword);
            req.setAttribute("users", userList);
            req.setAttribute("mainRight", "dormManagerList.jsp");
            req.getRequestDispatcher("/jsp/main.jsp").forward(req, resp);

        } else if (null != action && "preAdd".equals(action)) {
            //跳转到宿舍管理员添加页面
            req.setAttribute("mainRight", "dormManagerAddOrUpdate.jsp");
            req.getRequestDispatcher("/jsp/main.jsp").forward(req, resp);
        } else if (null != action && "save".equals(action)) {
            String name = req.getParameter("name");
            String password = req.getParameter("passWord");
            String sex = req.getParameter("sex");
            String tel = req.getParameter("tel");

            // 获取复选框中用户选中的宿舍楼
            String[] dormBuildIds = req.getParameterValues("dormBuildId");

            if (null == id || "".equals(id)) {
                User user = new User(name, password, sex, tel, null, 1);
                user.setDisabled(0);

                //当前登录用户
                User user2 = (User) req.getSession().getAttribute("session_user");
                user.setCreateUserId(user2.getId());

                userService.saveManager(user, dormBuildIds);
            } else {
                //通过宿舍管理员ID获取宿舍管理员
                User user = userService.findById(Integer.parseInt(id));

                user.setName(name);
                user.setPassword(password);
                user.setSex(sex);
                user.setTel(tel);
                user.setDisabled(0);

                userService.updateManager(user);
                // 修改还需修改宿舍管理员与宿舍楼的中间表
                // ① 删除当前宿舍管理员管理的所有宿舍楼
                dormManagerService.deleteByUserId(user.getId());
                // ② 新增当前宿舍管理员管理的所有宿舍楼
                dormManagerService.saveManagerAndBuild(user.getId(), dormBuildIds);
            }
            // 跳转到宿舍管理员列表页，查看所有的宿舍管理员
            // 重定向，请求链断开，不能在下一个servlet或jsp中获取保存在request中的参数
            resp.sendRedirect(getServletContext().getContextPath() + "/dormManager.action?action=list");
        } else if (null != action && action.equals("preUpdate")) {
            // 根据宿舍管理员ID，获取宿舍管理员
            User user = userService.findById(Integer.parseInt(id));
            // 根据宿舍管理员ID获取宿舍管理员管理的楼栋
            List<DormBuild> userBuilds = dormManagerService.findByUserId(user.getId());
            user.setDormBuilds(userBuilds);
            List<Integer> userBuildIds = new ArrayList<>();
            // 遍历当前宿舍管理员管理的所有宿舍，获取当时当前宿舍管理员管理的所有宿舍ID
            for (DormBuild userBuild : userBuilds) {
                userBuildIds.add(userBuild.getId());
            }
            req.setAttribute("userBuildIds", userBuildIds);
            req.setAttribute("user", user);
            req.setAttribute("mainRight", "dormManagerAddOrUpdate.jsp");
            req.getRequestDispatcher("/jsp/main.jsp").forward(req, resp);

        }else if(null!=action && "deleteOrActive".equals(action)){
            // 删除或激活
            String disabled = req.getParameter("disabled");

            // 通过宿舍管理员ID获取宿舍管理员
            User user = userService.findById(Integer.parseInt(id));
            user.setDisabled(Integer.parseInt(disabled));

            userService.updateManager(user);

            // 跳转到宿舍管理员列表页，查看所有的宿舍管理员
            // 重定向，请求链断开，不能在下一个servlet或jsp中获取保存在request中的参数
            resp.sendRedirect(getServletContext().getContextPath() + "/dormManager.action?action=list");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
